3. Обзор A64
=Обзор A64= The A64 instruction set provides similar functionality to the A32 and T32 instruction sets in AArch32 or ARMv7. However just as the addition of 32-bit instructions to the T32 instruction set rationalized some of the ARM ISA behaviors, the A64 instruction set includes further rationalizations. The highlights of the new instruction set are as follows: A clean, fixed length instruction set – instructions are 32 bits wide, register fields are contiguous bit fields at fixed positions, immediate values mostly occupy contiguous bit fields. Access to a larger general-purpose register file with 31 unbanked registers (0-30), with each register extended to 64 bits. General registers are encoded as 64-bit fields with register number 31 (0b11111) being a special case representing: Набор инструкций A64 предоставляет функционал, схожий с ARMv7 или с A32 и T32 в режиме AArch32. Набор T32 - это дополнение к 32-х разрядным инструкциям, рационализировавшее поведение ARM ISA (Instruction Set Architecture). Набор инструкций A64 содержит детальнейшие шаги рационализации. Далее перечислены основные идеи нового набора инструкций: *Понятная, фиксированная длинна инструкций. Она равна 32-м битам. Поле регистра — это непрерывное поле с фиксированной позицией. Непосредственные значения, так же занимают непрерывное битовое поле в большинстве случаев. *Большой регистровый файл общего назначения. 31 не сохраняемый (unbanked) регистр (0-30). Каждый из них расширен до 64-бит. Регистры общего назначения кодируются в виде 5-битного поля, в котором номер 31 (0b11111) интерпретируется следующим образом: Zero Register: in most cases register number 31 reads as zero when used as a source register, and discards the result when used as a destination register. Stack Pointer: when used as a load/store base register, and in a small selection of arithmetic instructions, register number 31 provides access to the current stack pointer. The PC is never accessible as a named register. Its use is implicit in certain instructions such as PC- relative load and address generation. The only instructions which cause a non-sequential change to the PC are the designated Control Flow instructions (see §5.2) and exceptions. The PC cannot be specified as the destination of a data processing instruction or load instruction. **Регистр нулей. В большинстве случаев, результат чтения из регистра с номером 31, если он указан как источник, равен нулю. Если он указан как приёмник, то это отправка "в никуда" . **Указатель стека. Если данный регистр используется как базовый в операциях load/store и в некоторых особых арифметических операциях, то он содержит текущую позицию в стеке. *Регистр PC (программный счётчик) не доступен по имени. Он используется внутренними механизмами ряда инструкций, например при обращении к памяти и генерации адреса относительно PC. Инструкции управляющие выполнением (Control Flow - гл. 5.2) и исключения — это единственные инструкции, которым разрешено модифицировать PC. Его нельзя указывать как приёмник в операциях обработки данных или чтения из память. The procedure call link register (LR) is unbanked, general-purpose register 30; exceptions save the restart PC to the target exception level’s ELR system register. Scalar load/store addressing modes are uniform across all sizes and signedness of scalar integer, floating point and vector registers. A load/store immediate offset may be scaled by the access size, increasing its effective offset range. A load/store index register may contain a 64-bit or 32-bit signed/unsigned value, optionally scaled by the access size. Arithmetic instructions for address generation which mirror the load/store addressing modes, see §3.3. *Регистр-связка для вызова процедур (LR - link register) является неохраняемым (unbanked) регистром общего назначения с номером 30. Исключения сохраняют PC для возврата (restart PC) в системный регистр ELR целевого уровня исключения. *Скалярные load/store приведены к общему стандарту адресации, не зависящему от размера и знаков скалярного значения, регистров плавающей точки и регистров вектора. *При сохранении/загрузке (load/store) непосредственное смещение может быть масштабировано относительно размера требуемого блока, за счёт увеличения эффективной совмещаемой области (effective offset range). *Индексный регистр для load/store может содержать 64-х или 32-х битное значение, со знаком или без, масштабированное относительно размера запрашиваемого блока (опционально). *Арифметические инструкции для генерации адреса, дублируют адресные режимы операций load/store (см. гл. 3.3). PC-relative load/store and address generation with a range of ±4GiB is possible using just two instructions without the need to load an offset from a literal pool. PC-relative offsets for literal pool access and most conditional branches are extended to ±1MiB, and for unconditional branches and calls to ±128MiB. There are no multiple register LDM, STM, PUSH and POP instructions, but load-store of a non-contiguous pair of registers is available. Unaligned addresses are permitted for most loads and stores, including paired register accesses, floating point and SIMD registers, with the exception of exclusive and ordered accesses (see §3.5.2). Reduced conditionality. Fewer instructions can set the condition flags. Only conditional branches, and a handful of data processing instructions read the condition flags. Conditional or predicated execution is not provided, and there is no equivalent of T32’s IT instruction (see §3.2). *Операции load/store относительно PC и генерация адреса с диапазоном +/-4ГиБ реализуются всего двумя инструкциями без необходимости загрузки смещения из пула литералов. *Смещения для доступа к пулу литералов относительно PC и большинство условных переходов расширены до +/-1МиБ, а безусловные переходы и вызовы до +/-128МиБ. *Для LDM, STM, PUSH и POP запрещено перечисление нескольких регистров, хотя для load/store доступно перечисление (но не диапазон) пары регистров. *Невыровненные адреса разрешены для большинства операций записи и чтения из памяти, включая доступ к паре регистров, к регистрам плавающей точки и SIMD-регистрам. Исключения составляют операции эксклюзивного и упорядоченного (ordered) доступа (см. гл. 3.5.2). *Сокращены виды условного выполнения команд. Уменьшено число инструкций для которых разрешено устанавливать флаги условий. Только условные переходы и небольшой набор инструкций, обрабатывающих данные, считывают флаги условий перед выполнением. Условное или предикатное выполнение больше не поддерживается. Так же отсутствует аналог инструкции IT из набора T32 (см. гл. 3.2). A shift option for the final register operand of data processing instructions is available: Immediate shifts only (as in T32). No RRX shift, and no ROR shift for ADD/SUB. The ADD/SUB/CMP instructions can first sign or zero-extend a byte, halfword or word in the final register operand, followed by an optional left shift of 1 to 4 bits. Immediate generation replaces A32’s rotated 8-bit immediate with operation-specific encodings: o Arithmetic instructions have a simple 12-bit immediate, with an optional left shift by 12. o Logical instructions provide sophisticated replicating bit mask generation. o Other immediates may be constructed inline in 16-bit “chunks”, extending upon the MOVW and MOVT instructions of AArch32. *Для последнего регистра-операнда инструкций обработки данных доступны операции битового сдвига: **Только непосредственный сдвиг (как для T32) **RRX не поддерживается, а ROR не доступен в инструкциях ADD/SUB. **Для инструкций ADD/SUB/CMP последний регистровый операнд может быть опционально, сдвинут влево на количество бит от 1 до 4 и затем изменён знак, значение может быть дополнено нулями до байта, полуслова, слова. *Непосредственная генерация пришла на смену циклическому 8-и битному сдвигу непосредственных значений, применявшемуся в A32 для кодировки параметров специфичной для отдельных операций: **Арифметическим инструкциям передаются 12-битные непосредственные значения с опциональным сдвигом влево на 12. **Для логических инструкций доступна более сложная генерация значений с применением замены по битовой маске. **Другие непосредственные значения могут быть сконструированы встраиваемыми (inline) участками кода в 16-и битных кусках (“chunks”). Непосредственные значения могут быть расширены в рамках инструкций MOVW и MOVT по стандартам AArch32. Floating point support is similar to AArch32 VFP but with some extensions, as described in §3.6. Floating point and Advanced SIMD processing share a register file, in a similar manner to AArch32, but extended to thirty-two 128-bit registers. Smaller registers are no longer packed into larger registers, but are mapped one-to-one to the low-order bits of the 128-bit register, as described in 4.4.2. • There are no SIMD or saturating arithmetic instructions which operate on the general purpose registers, such operations being available only as part of the Advanced SIMD processing, described in §5.8. • There is no access to CPSR as a single register, but new system instructions provide the ability to atomically modify individual processor state fields, see §5.9.2. *Поддержка операций с плавающей точкой похожа на стандарт AArch32 VFP, но содержит ряд расширений, описанных в гл. 3.6. *Операций с плавающей точкой и Расширенный SIMD используют один и тот же регистровый файл, в том же стиле что и AArch32, но теперь это двадцать три 128-и битных регистра. Регистры меньшей длинны больше не упаковываются в более длинные регистры, но отображены один к одному для операций в младшие биты 128-ми битных регистров. Это объясняется в гл. 4.4.2. *Арифметических операций SIMD или операций с насыщением, которые могли бы работать с регистрами общего назначения, не существует. Подобные операции доступны только как часть расширенного SIMD, описного в гл 5.8. *Доступ к CPSR, как к единому регистру запрещён, однако новые системные инструкции предоставляют возможность автоматически модифицировать отдельные поля состояния процессора (см. гл. 5.9.2). • The concept of a “coprocessor” is removed from the architecture. A set of system instructions described in §5.9 provides: o System register access o Cache/TLB management o VA PA translation o Barriers and CLREX o Architectural hints (WFI, etc) o Debug *Понятие "сопроцессор" исключено из архитектуры. Набор системных инструкций описанный в гл. 5.9 обеспечивает следующие возможности: **Доступ к системным регистрам **Управление кэшем и TLB (буфером ассоциативной трансляции). **Преобразование VA (виртуальных адресов) в PA (физические адреса) и обратно. **Барьеры и CLREX (Clear Exclusive). **Архитектурные подсказки (Architectural hints), такие как режим ожидания прерывания - WFI и т.д. **Отладка Отличия 32-х и 64-х разрядных инструкций Most integer instructions in the A64 instruction set have two forms, which operate on either 32-bit or 64-bit values within the 64-bit general-purpose register file. Where a 32-bit instruction form is selected, the following holds true: • The upper 32 bits of the source registers are ignored; • The upper 32 bits of the destination register are set to ZERO; • Right shifts/rotates inject at bit 31, instead of bit 63; • The condition flags, where set by the instruction, are computed from the lower 32 bits. This distinction applies even when the result(s) of a 32-bit instruction form would be indistinguishable from the lower 32 bits computed by the equivalent 64-bit instruction form. For example a 32-bit bitwise ORR could be performed using a 64-bit ORR, and simply ignoring the top 32 bits of the result. But the A64 instruction set includes separate 32 and 64-bit forms of the ORR instruction. Большинство целочисленных инструкций в наборе инструкций A64 можно разделить на два типа: обрабатывающие 32-х разрядные и обрабатывающие 64-х разрядные значения. Оба типа значений хранятся в 64-х разрядном регистровом файле общего назначения. Для 32-х разрядного типа инструкции справедливы следующие утверждения: *Старшие 32 бита регистра-иточника игнорируются *Старшие 32 бита регистра-приемника заполняются нулями *Правый сдвиг/круговой правый сдвиг перемещает бит в 31-ю позицию вместо 63-ей *Если флаги условий изменяются в результате вычислений, то в расчёт берётся только 32 младших бита. Эти особенности проявляются, когда результат(ы) инструкций 32-х битного типа неотличимы от младших 32-х разрядов полученных в результате выполнения инструкции 64-битного типа. Например, 32-х разрядное побитовое ИЛИ может быть выполнено с помощью 64-х разрядной инструкции ИЛИ и отбрасывания старших 32-х разрядов результата. Тем не мение набор инструкций A64 включает отдельные версии инструкции ORR: 32-х и 64-х разрядную. Rationale: The C/C++ LP64 and LLP64 data models – expected to be the most commonly used on AArch64 – both define the frequently used int, short and char types to be 32 bits or less. By maintaining this semantic information in the instruction set, implementations can exploit this information to avoid expending energy or cycles to compute, forward and store the unused upper 32 bits of such data types. Implementations are free to exploit this freedom in whatever way they choose to save energy. As well as distinct sign/zero-extend instructions, the A64 instruction set also provides the ability to extend and shift the final source register of an ADD, SUB or CMP instruction and the index register of a load/store instruction. This allows for an efficient implementation of array index calculations involving a 64-bit array pointer and 32-bit array index. The assembly language notation is designed to allow the identification of registers holding 32-bit values as distinct from those holding 64-bit values. As well as aiding readability, tools may be able to use this to perform limited type checking, to identify programming errors resulting from the change in register size. Обоснование: Модели данных LP64 и LLP64, применяемые в C/C++, будут использоваться в AArch64 чаще всего. Обе модели включат целочисленные, короткие целочисленные и символьные типы данных, для которых требуется 32 или менее бита. При реализации конкретного языка, поддержка данной семантики в наборе инструкций даёт возможность сэкономить энергию или количество циклов, затрачиваемое на обработку, пересылку и хранение неиспользуемых старших 32-х бит для данных типов. Данная возможность может быть использована любым способом в целях экономии энергии. Наряду с отдельными инструкциями изменяющими знак/дополняющими нулями, набор инструкций A64 предоставляет возможность дополнить или сдвинуть последний регистр-источник инструкций ADD, SUB и CMP и индексный регистр инструкций load/store. Такая возможность включена для эффективной реализации вычислений индекса массива с участием 64-битного указателя в массиве и 32-х разрядного индекса массива. Нотация языка ассемблера спроектирована таким образом, чтобы отличать регистры содержащие 32-битные значения от тех, что содержат 64-битные. Кроме улучшения читаемости кода, нотация может быть использована утилитами, проверяющими типы лимитов для устранения ошибок в коде, связанных с изменениями размеров регистров. Условные инструкции The A64 instruction set does not include the concept of predicated or conditional execution. Benchmarking shows that modern branch predictors work well enough that predicated execution of instructions does not offer sufficient benefit to justify its significant use of opcode space, and its implementation cost in advanced implementations. A very small set of “conditional data processing” instructions are provided. These instructions are unconditionally executed but use the condition flags as an extra input to the instruction. This set has been shown to be beneficial in situations where conditional branches predict poorly, or are otherwise inefficient. Набор инструкций A64 не включает в себя механизмов предикатного или условного выполнения. Беэнчмарки показывают, что современное прогнозирование переходов достаточно развито, а значит польза предикатного выполнения инструкций не сопоставима с расходами на хранение значительного количества опкодов и ценой его реализации в конкретных решениях. В результате оставлено небольшое количество инструкций класса "условная обработка данных". Они так же выполняются без учёта условий, но флаги условий передаются инструкциям в качестве дополнительных параметров. Выигрыш от использования данных инструкций можно получить, когда условный переход трудно предсказуем или у программиста просто нет выбора. The conditional instruction types are: • Conditional branch: the traditional ARM conditional branch, together with compare and branch if register zero/non-zero, and test single bit in register and branch if zero/non-zero – all with increased displacement. • Add/subtract with carry: the traditional ARM instructions, for multi-precision arithmetic, checksums, etc. • Conditional select with increment, negate or invert: conditionally select between one source register and a second incremented/negated/inverted/unmodified source register. Benchmarking reveals these to be the highest frequency uses of single conditional instructions, e.g. for counting, absolute value, etc. These instructions also implement: Conditional select (move): sets the destination to one of two source registers, selected by the condition flags. Short conditional sequences can be replaced by unconditional instructions followed by a conditional select. Conditional set: conditionally select between 0 and 1 or -1, for example to materialize the condition flags as a Boolean value or mask in a general register. Conditional compare: sets the condition flags to the result of a comparison if the original condition was true, else to an immediate value. Permits the flattening of nested conditional expressions without using conditional branches or performing Boolean arithmetic within general registers. Существуют следующие типы условных инструкций: *Условные переходы — это традиционные переходы, принятые в ARM. Они применяются в связке со сравнением, и осуществляют переход если регистр содержит/не содержит ноль, или в связке с проверкой одного бита в регистре и осуществляют переход если это ноль/не ноль. Для всех переходов увеличено максимальное расстояние прыжка. *Сложение/вычитание с переносом — это традиционные инструкции, принятые в ARM для арифметики с повышенной точностью, вычисления контрольных сумм и т. д. *Условный выбор с увеличением, изменением знака или инвертированием: условный выбор между первым регистром-источником и следующем регистром-источником который увеличивается/инвертируется/меняет знак/не изменяется. Результаты бенчмарков свидетельствуют о том, что данные инструкции наиболее часто используются с одним условием, например для вычислений, абсолютных значений и т.д. Эти же инструкции реализуют следующие операции: **Условный выбор (перемещение): выбирает расположение одного или двух регистров-источников, руководствуясь флагами условий. Короткая последовательность условных инструкций может быть заменена безусловной инструкцией в связке с условным выбором. **Условная установка: в зависимости от флагов условий осуществляется выбор между 0, 1 и -1. Например, чтобы отразить значение флага в виде логического значения или в виде маски в регистре общего назначения. *Условное сравнение: устанавливает флаги условий в зависимости от результата сравнивания только если на входе было передано значение ИСТИНА (true) иначе устанавливает флаги в соответствии с переданным значением. Данная операция позволяет уплотнить вложенные условные выражения без привлечения условных переходов или логических вычислений внутри регистров общего назначения. Особенности адресации The prime motivation for a 64-bit architecture is access to a larger virtual address space. The AArch64 memory translation system supports a 49-bit virtual address (48 bits per translation table). Virtual addresses are sign-extended from 49 bits, and stored within a 64-bit pointer. Optionally, under control of a system register, the most significant 8 bits of a 64-bit pointer may hold a “tag” which will be ignored when used as a load/store address or the target of an indirect branch. Главная мотивация перехода на 64-х битную архитектуру - увеличение диапазона виртуальных адресов. В режиме AArch64 доступна система трансляции памяти, поддерживающая 49-ти битные виртуальные адреса (по 48 бит на таблицу трансляции). Виртуальные адреса расширяются до 49 бит за счёт бита, отвечающего за знак и хранятся в 64-х битном указателе. Опционально, под контролем системного регистра, самые старше 8 бит 64-х битного указателя могу содержать тэг, который будет игнорироваться при использовании указателя в качестве адреса для load/store или непрямого перехода. Адресация с индексированием по значению в регистре The A64 instruction set extends on 32-bit T32 addressing modes, allowing a 64-bit index register to be added to the 64-bit base register, with optional scaling of the index by the access size. Additionally it provides for sign or zero-extension of a 32-bit value within an index register, again with optional scaling. These register index addressing modes provide a useful performance gain if they can be performed within a single cycle, and it is believed that at least some implementations will be able to do this. However, based on implementation experience with AArch32, it is expected that other implementations will need an additional cycle to execute such addressing modes. Rationale: The architects intend that implementations should be free to fine-tune the performance trade-offs within each implementation, and note that providing an instruction which in some implementations takes two cycles, is preferable to requiring the dynamic grouping of two independent instructions in an implementation that can perform this address arithmetic in a single cycle. Режимы адресации набор инструкций A64, - это расширенные режимы T32. Они позволяет суммировать 64-битный регистр-индекс с 64-битным регистром-базой с опциональным масштабированием индекса по размеру запрашиваемого блока. Возможны дополнительные операции над 32-х битным значением в регистре-индексе: изменение знака, дополнение нулями и опциональным масштабированием. Режим адресации с применением регистра-индекса спроектирован с целью увеличения производительности. Подразумевается, что он будет использован внутри единого цикла и реализован в каких-то конкретных решениях. Однако, учитывая опыт AArch32, ожидается что в других реализациях могут потребоваться дополнительные циклы для использования такого режим адресации. Обоснование: Цели архитекторов: реализация с возможностью тонкой настройки, стремление к производительности в каждой реализации и использованию инструкций, которые в некоторый реализациях требуют двух циклов. Последнее замечание касаются случаев динамического группирования двух независимых инструкций в реализации, способной вычислять тот же адрес в одном цикле. Адресация относительно PC There is improved support for position-independent code and data addressing: • PC-relative literal loads have an offset range of ±1MiB. This permits fewer literal pools, and more sharing of literal data between functions – reducing I-cache and TLB pollution. • Most conditional branches have a range of ±1MiB, expected to be sufficient for the majority of conditional branches which take place within a single function. • Unconditional branches, including branch and link, have a range of ±128MiB. Expected to be sufficient to span the static code segment of most executable load modules and shared objects, without needing linker-inserted trampolines or “veneers”. • PC-relative load/store and address generation with a range of ±4GiB may be performed inline using only two instructions, i.e. without the need to load an offset from a literal pool. Появилась улучшенная поддержка переносимой (position-independent) адресации кода и данных: *Операция load по литералу, относитльно PC может быть выполнена в диапазоне +/- 1МиБ. Это позволяет уменшить пул литералов, расширить использование общих литералов, описывающих данные для нескольких функций, экономит I-кэш и уменьшает загрязнение TLB. *Большинство условных переходов ограничены диапазоном +/- 1 МиБ. Этого должно хватить почти для всех условных переходов внутри одной функции. *Безусловные переходы, включая прямые прыжки и переходы по ссылкам ограничены +/-128МиБ. Этого должно быть достаточно для охвата статических сегментов кода большинства подгружаемых областей и разделяемых объектов (shared objects) без привлечения подствляемых линковщиком трамплинов и "виниров" (“veneers”). *Операции load/store, зависящие от PC и операции генерации адреса в диапазоне +/- 4ГиБ могут осуществлятся встраиваемыми (inline) конструкциями из друх инструкций, т.е. без получения смещения из пула литералов. Программный счётчик (PC) The current Program Counter (PC) cannot be referred to by number as if part of the general register file and therefore cannot be used as the source or destination of arithmetic instructions, or as the base, index or transfer register of load/store instructions. The only instructions which read the PC are those whose function is to compute a PC-relative address (ADR, ADRP, literal load, and direct branches), and the branch-and-link instructions which store it in the link register (BL and BLR). The only way to modify the Program Counter is using explicit control flow instructions: conditional branch, unconditional branch, exception generation and exception return instructions. Where the PC is read by an instruction to compute a PC-relative address, then its value is the address of the instruction, i.e. unlike A32 and T32 there is no implied offset of 4 or 8 bytes. Текущий программный счетчик (PC) не описывается регистром с каким-либо номером, как если бы он являлся частью файла регистров общего назначения. Следовательно, его нельзя использовать как регистр-источник или регистр-приемник в арифметических операциях, а так же как базу, индекс или модифицируемый регистр в инструкциях load/store. Единственными инструкциями, которые считывают PC, являются те, чья функция заключается в вычислениее адресов, зависящих от PC (ADR, ADRP, загрузка литералов и прямые прыжки). Единственными инструкциями, которые модифицируют PC, являются инструкции прыжка и перехода по ссылке, которые сохраняют PC в регистре-связке (инструкции BL и BLR). Модифицировать программный счетчик можно только одним способом - с помощью внутренних инструкций управления выполнением (control flow). Это условные переходы, безусловные переходы, генерация исключений и инструкции возврата из исключений. В момент считывания PC для вычисления адреса зависящего от PC, инструкция получает значение соответствующее адресу текущей инструкции. Это серьезное отличие от A32 и T32, которые предусматривали смещение в 4 или 8 байт. Запись/чтение из памяти Массовая пересылка данных The LDM, STM, PUSH and POP instructions do not exist in A64, however bulk transfers can be constructed using the LDP and STP instructions which load and store a pair of independent registers from consecutive memory locations, and which support unaligned addresses when accessing normal memory. The LDNP and STNP instructions additionally provide a “streaming” or ”non-temporal” hint that the data does not need to be retained in caches. The PRFM (prefetch memory) instructions also include hints for “streaming” or “non-temporal” accesses, and allow targeting of a prefetch to a specific cache level. Инструкции LDM, STM, PUSH и POP отсутствуют в наборе A64, однако массовая передача данных может быть организованна с помощью LDP и STP, которые считывают и сохраняют пару отдельных регистров из/в непрерывную область памяти. Инструкции LDP и STP поддерживают невыровненные адреса при доступе к обычной памяти. Инструкции LDNP и STNP дополнены возможностью подсказки, что передаются потоковые (“streaming”) или так называемые не темпоральные данные (”non-temporal”). Подсказка позволяет не помещать данные в кэш. Инструкция PRFM (память предвыборки) так же предусматривает “streaming” (потоковый) или “non-temporal” (вневременной) доступ с указанием цели предвыборки и уточнение уровня кэша (cache level). Эксклюзивный доступ Exclusive load-store of a byte, halfword, word and doubleword. Exclusive access to a pair of doublewords permit atomic updates of a pair of pointers, for example circular list inserts. All exclusive accesses must be naturally aligned, and exclusive pair access must be aligned to twice the data size (i.e. 16 bytes for a 64-bit pair). Эксклюзивные load/store байта, полуслова, слова и двойного слова. Эксклюзивный доступ к паре двойных слов позволяет атомарно обновить пару указателей, например при добавлении элемента в кольцевой список. Все виды эксклюзивного доступа должны быть естественным образом выровнены (naturally aligned), а эксклюзивный доступ к паре должен быть выровнен на величину двойного размера необходимых данных (т.е. 16 байт для пары 64-битных значений). Чтение-захват, Запись-освобождение Explicitly synchronising load and store instructions implement the release-consistency (RCsc) memory model, reducing the need for explicit memory barriers, and providing a good match to emerging language standards for shared memory. The instructions exist in both exclusive and non-exclusive forms, and require natural address alignment. See §5.3.7 for more details. Инструкции эксклюзивного синхронизированного load/store реализуют модель памяти с целостностью освобождения (RCsc - release-consistency), которая избавляет от явного использования барьеров памяти и предоставляет механизми подходящий для стандартов общей памяти, появляющихся в современных языках программирования. Существуют инструкции в эксклюзивной и не эксклюзивной форме, но и те и другие требуют естественного выравнивания адреса. См. гл. 5.3.7. Целочисленное умножение/деление Including 32 and 64-bit multiply, with accumulation: Умножение делится на 32-х и 64-х битное и предусматривает накопление. (32) ± (32 x 32) → 32 (64) ± (64 x 64) → 64 ± (32 x 32) → 32 ± (64 x 64) → 64 Widening multiply (signed and unsigned), with accumulation: Расширенное умножение (со знаком и без) с накоплением: 64 ± (64 x 64) → 64 ± (32 x 32) → 64 (64 x 64) → hi64 <127:64> Multiply instructions write a single register. A 64x64 to 128-bit multiply requires a sequence of two instructions to generate a pair of 64-bit result registers: Инструкции умножения модифицируют один регистр. 128-битный результат операции 64x64 поулчается с помощью двух инструкцйи, генерирующих пару результатов в 64-битных регистрах. +(64 x 64) → <63:0> (64 x 64) → <127:64> Signed and unsigned 32- and 64-bit divide are also provided. A remainder instruction is not provided, but a remainder may be computed easily from the dividend, divisor and quotient using an MSUB instruction. There is no hardware check for “divide by zero”, but this check can be performed in the shadow of a long latency division. A divide by zero writes zero to the destination register. Так же доступно 32-х и 64-х битное деление со знаком и без. Инструкции вычисления остатка не предостовляются, однако остаток может быть вычеслен, если полученые в результате деления делитель и частное будут умножены инстуркцией MSUB. Отсутствует аппаратное обнаружение делния на ноль (divide by zero), но данная проверка может быть реализовано в фоне операции деления с задержкой (long latency division). Деление на ноль будет приводить к записи нуля в регистр-приемник. Скалярные операции с плавающей точкой AArch64 mandates hardware floating point wherever floating point arithmetic is required – there is no “soft-float” variant of the AArch64 Procedure Calling Standard (PCS). Scalar floating point functionality is similar to AArch32 VFP, with the following changes: • The deprecated “small vector” feature of VFP is removed. • There are 32 S registers and 32 D registers. The S registers are not packed into D registers, but occupy the low 32 bits of the corresponding D register. For example S31=D31<31:0>, not D15<63:32>. • Load/store addressing modes identical to integer load/stores. • Load/store of a pair of floating point registers. • Floating point FCSEL and FCCMP equivalent to the integer CSEL and CCMP. • Floating point FCMP and FCCMP instructions set the integer condition flags directly, and do not modify the condition flags in the FPSR. • All floating-point multiply-add and multiply-subtract instructions are “fused”. • Convert between 64-bit integer and floating point. • Convert FP to integer with explicit rounding direction: towards zero, towards +Inf, towards -Inf, to nearest with ties to even, and to nearest with ties away from zero. • Round FP to nearest integral FP with explicit rounding direction (as above). • Direct conversion between half-precision and double-precision. • FMINNM & FMAXNM implementing the IEEE754-2008 minNum() and maxNum() operations, returning the numerical value if one of the operands is a quiet NaN. AArch64 обращается к аппаратным вычислениям с плавающей точкой во всех случаях, когда это необходимо, т.е. программных алгоритмы “soft-float” не существует в стандарте вызова процедур (PCS - Procedure Calling Standard) режима AArch64. Функционал скалярных вычислений с плавающей точкой аналогичен AArch32 VFP, со следующими измерениями: *Устаревшая возможность “small vector” больше не доступна. *Теперь количество S-регисторв - 32 и D-регистров то же 32. S-регистры не упаковываются в D-регистры, но занимают младшие 32-байна в соответствующим D-регистре. Например S31=D31<31:0>, а не D15<63:32>. *Режимы адресации для load/store те же, что и в случае с целочисленными load/store. *Возможны операции load/store с плавающей точкой с парой регистров. *Операции с плавающей точкой FCMP и FCCMP напрямую устанавливают целочисленные флаги условий. и не модифицируют флаги условий в FPSR. Для вех операций множественного сложения и множественного вычитания плавающей точкой теперь применяется однократное округление (fused multiply-add и fused multiply-subtract). *Конвертация между 64-битным целым и числом с плавающей точкой. *Конвертация чисел с плавающей точкой в целочисленные с явным определением направления округления (в сторону нуля, в строну положительной бесконечности, отрицательной бесконечности, ближайшего целого, ближайшего целого без приближения к нулю. *Округление чисел с плавающей к целому числу в формате числа с плавающей точкой с явным указанием направления округления (так же как в предыдущем пункте). Инструкции FMINNM и FMAXNM реализуют абстракции minNum() и maxNum() стандарта IEEE754-2008, которые возвращают числовые значения если один из операндов Quiet NaN (НЕ ЧИСЛО, передающееся по цепочке операций, пока это возможно). Расширеный SIMD См. гл. 5.8 для детального описания.